package com.cc.util;

import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

/**
 * @author CC
 * @version 1.0
 * @description: 文件上传
 * @date 2025/6/23 9:10
 */
@Component
public class FileUtil {
    // 允许上传的图片类型白名单
    private static final Set<String> ALLOWED_EXTENSIONS = new HashSet<>(
            Arrays.asList(".jpg", ".jpeg", ".png", ".gif", ".bmp"));

    private static final String uploadPath = "C:/ideaProject/spring_mvcCodes/ssm01/src/main/webapp/static/upload";

    /**
     * 文件上传方法
     *
     * @param file MultipartFile
     * @return 返回访问路径 或 null
     */
    public static String upload(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            System.out.println("上传失败：文件为空");
            return null;
        }

        try {
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || originalFilename.isEmpty()) {
                System.out.println("上传失败：文件名为空");
                return null;
            }

            // 获取扩展名并校验
            String ext = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
            if (!ALLOWED_EXTENSIONS.contains(ext)) {
                System.out.println("不允许的文件类型：" + ext);
                return null;
            }

            // 使用UUID重命名
            String name = UUID.randomUUID().toString().replaceAll("-", "");

            // 创建目标目录
            File targetDir = new File(uploadPath);
            if (!isFolderExists(targetDir)) {
                System.out.println("目标目录创建失败");
                return null;
            }

            // 构建目标文件路径
            File targetFile = new File(targetDir, name + ext);
            // 保存文件
            file.transferTo(targetFile);
            System.out.println("上传成功：" + targetFile.getAbsolutePath());

            // 返回相对路径（用于前端访问）
            return "/upload/" + name + ext;

        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("上传失败：文件处理异常");
            return null;
        }
    }

    /**
     * 判断文件夹是否存在，若不存在则创建
     */
    public static boolean isFolderExists(File folder) {
        if (!folder.exists()) {
            return folder.mkdirs(); // 创建所有必要父目录
        }
        return true;
    }

}
